// 截流
function throttle(fn, timeout) {
  let timer = null,
    that = this;

  return function (...args) {
    timer = setTimeout(() => {
      // 这里注意，需要使用外层的this
      fn.call(that, ...args);
      clearTimeout(timer);
    }, timeout);
  };
}

const a = {
  a: 1,
  b: 2,
};

// 防抖
function debounce(fn, time) {
  let timer = null,
    last = "",
    that = this;

  return function (...args) {
    const now = Date.now();
    if (now - last > now) {
      clearTimeout(timer);

      timer = setTimeout(() => {
        last = now;
        fn && fn.call(that, ...args);
      }, time);
    }
  };
}

// 防抖 debounce，平时用来处理输入后请求，比如搜索等功能，等最后一个单词打完后的time时候后，进行网络请求
// 对于定时器内的触发，需要取消掉当前的，然后，重新开始计时
function debounce(fn, time) {
  let timer = null;

  return function () {
    //   如果重复触发，就取消掉，不让其执行，直到最后一次执行结束后的time 时间内执行
    clearTimeout(timer);
    timer = setTimeout(() => {
      fn && fn.apply(this);
    }, time);
  };
}

// 截流，在规定时间内只执行一次，在 scroll 中，判断是否到了某个位置，就可以使用这个
// 对于，定时器内的触发，不进行处理，直接return
function throttle(fn, time) {
  let timer = null;
  return function () {
    //   如果当前有正在执行的，就忽略掉即可
    if (timer) return;

    timer = setTimeout(() => {
      fn && fn.apply(this);
      // 执行完成之后，清除掉这个定时器，相当于一个标识符tag
      clearTimeout(timer);
    }, time);
  };
}
